#include "test/test.h"

#define DISP_BUF_SIZE (480 * 1024)

//
// static void event_font_handler(lv_event_t * e)
//{
//    lv_event_code_t code = lv_event_get_code(e);
//    if(code == LV_EVENT_PRESSED) {
//        printf("ok\n");
//    }
//}
// void lv_hanhan_font_test()
//{
//    /*
//    显示中文字的说明:要添加 chinese_ziku.c lv_font_source_han_sans_bold_20.c两个文件
//    */
//    // 在按键上面显示中文标签
//    lv_obj_t * btn1 = lv_btn_create(lv_scr_act());
//    lv_obj_set_size(btn1, 200, 200);
//    lv_obj_set_pos(btn1, 400, 240);
//    lv_obj_add_event_cb(btn1, event_font_handler, LV_EVENT_PRESSED, NULL);
//
//    lv_obj_t * wendu = lv_label_create(btn1);
//    lv_obj_align(wendu, LV_ALIGN_CENTER, 0, 0);
//    lv_label_set_text(wendu, "上一张");
//    // 20字体的大小
//    lv_obj_set_style_text_font(wendu, &chinese_ziku, 0);
//    // 20字体的大小粗体
//    //lv_obj_set_style_text_font(wendu, &chinese_ziku, 0);
//
//    // 直接显示中文label标签
//    lv_obj_t * label = lv_label_create(lv_scr_act());
//    // 设置文本内容
//    lv_label_set_text(label, "你好世界");
//    // 设置label的大小：
//    lv_obj_set_width(label, 300); // 设置宽度为100px
//    lv_obj_set_height(label, 50); // 设置高度为50px
//    // 设置字体的大小
//    lv_obj_set_style_text_font(label, &chinese_ziku, 0);
//    // 设置标签的位置
//    lv_obj_set_pos(label, 100, 100);
//}

int main(void)
{
    /*lvgl初始化*/
    lv_init();

    /*输出设备初始化及注册*/
    fbdev_init();
    /*A small buffer for LittlevGL to draw the screen's content*/
    static lv_color_t buf[DISP_BUF_SIZE];
    /*Initialize a descriptor for the buffer*/
    static lv_disp_draw_buf_t disp_buf;
    lv_disp_draw_buf_init(&disp_buf, buf, NULL, DISP_BUF_SIZE);
    /*Initialize and register a display driver*/
    static lv_disp_drv_t disp_drv;
    lv_disp_drv_init(&disp_drv);
    disp_drv.draw_buf = &disp_buf;
    disp_drv.flush_cb = fbdev_flush;
    disp_drv.hor_res  = 800;
    disp_drv.ver_res  = 480;
    lv_disp_drv_register(&disp_drv);

    // 输入设备初始化及注册
    evdev_init();
    static lv_indev_drv_t indev_drv_1;
    lv_indev_drv_init(&indev_drv_1); /*Basic initialization*/
    indev_drv_1.type = LV_INDEV_TYPE_POINTER;
    /*This function will be called periodically (by the library) to get the mouse position and state*/
    indev_drv_1.read_cb = evdev_read;
    lv_indev_drv_register(&indev_drv_1);
    // lv_indev_t *mouse_indev = lv_indev_drv_register(&indev_drv_1);

    // 调用用户节拍获取函数，并注册
    // 官方demo---可以换为自己的demo
    // lv_demo_widgets();
    //

    // 实现图片按钮
    // test_btn_image();
    // test_btn_image2();

    // 实现按钮
    // lv_hanhan_btn_1();

    // 实现gif图片显示
    // lv_hanhan_gif_1();

    //// 创建一个标签,显示文本
    // lv_obj_t * label = lv_label_create(lv_scr_act());
    //// 设置文本内容
    ////lv_label_set_text(label, "Hello, LVGL!");
    //

    //// 使能字体的颜色
    // lv_label_set_recolor(label, true);
    // lv_label_set_text(label, "#ff00ff Hello, hanhan!#"); // #颜色#文本#     成对出现#时，仅中间的文本显示为指定颜色
    // //lv_label_set_text(label,"#ff00ff led#"); //设置文本颜色的格式

    //// 设置label的大小：
    // lv_obj_set_width(label, 300); // 设置宽度为300px
    // lv_obj_set_height(label, 50); // 设置高度为50px

    //// 设置字体的大小
    // lv_obj_set_style_text_font(label, &lv_font_montserrat_20, 0);

    //// 设置标签的位置
    // lv_obj_set_pos(label, 100, 100);

    // 实现滚动显示
    // lv_hanhan_label_3();

    // 在屏幕上显示jpg图片
    // lv_hanhan_image_1();

    // 实现消息框
    // lv_hanhan_msgbox_1();

    // 实现list列表
    // lv_hanhan_list_1();

    // 实现键盘输入
    // lv_hanhan_keyboard_1();

    // 定义一个样式表，在屏幕中间显示一个红色的正方形
    // lv_hanhan_stylesheet_1();

    // 使用自定义的中文字体,显示文本,由于未知原因所以目前只能定义在main函数中    ???
     //lv_hanhan_font_test();



    timer_button_test();








    // 使用样式表定义的边框
    //lv_hanhan_border_stylesheet_2();

    /*事物处理及告知lvgl节拍数*/
    while(1) {
        lv_timer_handler(); // 事务处理
        lv_tick_inc(5);     // 节拍累计
        usleep(5000);
    }

    return 0;
}

/*用户节拍获取*/
uint32_t custom_tick_get(void)
{
    static uint64_t start_ms = 0;
    if(start_ms == 0) {
        struct timeval tv_start;
        gettimeofday(&tv_start, NULL);
        start_ms = (tv_start.tv_sec * 1000000 + tv_start.tv_usec) / 1000;
    }

    struct timeval tv_now;
    gettimeofday(&tv_now, NULL);
    uint64_t now_ms;
    now_ms = (tv_now.tv_sec * 1000000 + tv_now.tv_usec) / 1000;

    uint32_t time_ms = now_ms - start_ms;
    return time_ms;
}